在这一部分我们主要来介绍一些 Docker 的高级内容:
Dockerfile Docker compose

4.1 Dockerfile

学习目标:
了解 Dockerfile 简介及特点
应用 Dockerfile 使用命令
说出 Dockerfile 常见指令及其特点

4 .1 .1  Dockerfile 简介

这一节,我们从定义、作用、准则、文件内容、基础指令、使用命令这六个方面来学习。
什么是 Dockerfile
Dockerfile 类似于我们学习过的脚本,将我们在上面学到的 docker 镜像,使用自动化的方式实现出来。
Dockerfile 的作用
1 、找一个镜像:    ubuntu
2 、创建一个容器: docker run  ubuntu
3 、进入容器: docker exec -it 容器 命令
4 、操作: 各种应用配置
....
5 、构造新镜像: docker commit   
 
D ocker file 使用 准则
1 、大: 首字母 必须大写 D
2 空: 尽量将 Dockerfile 放在空目录中。
3 单: 每个容器尽量只有一个功能。
4 少: 执行的命令越少越好。
 
Dockerfile 基础四指令 :
基础镜像信息 从哪来?
维护者信息 我是谁?
镜像操作指令 怎么干?
容器启动时执行指令 嗨!!!
 
Dockerfile 使用命令:
构建镜像命令格式:
docker build -t [ 镜像名 ] : [ 版本号 ] [Dockerfile 所在目录 ]
构建样例:
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
参数详解:
-t 指定 构建后 镜像信息
/opt/dockerfile/nginx/ 则代表 Dockerfile 存放位置,如果是当前目录,则用 .( ) 表示
 
 

4 .1 .2 Dockerfile 快速入门

这一节,我们从环境、文件、构建、效果这四个方面来速的使用 Dockerfile 来创建一个定制化的镜像: ssh
准备环境
创建 Dockerfile 专用目录
mkdir /docker/images/ssh -p
cd /docker/images/ssh

创建秘钥认证
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys

准备软件源
cp /etc/apt/sources.list ./
注意:
课堂上因为多方面的原因,我们不执行这一步 -20181125
 
定制文件
创建 Dockerfile 文件
# 构建一个基于 ubuntu ssh 定制镜像
# 基础镜像
FROM ubuntu-base
# 镜像作者
MAINTAINER President.Wang 000000@qq.com
# 执行命令
# 增加软件源 -- 由于课堂网络原因,我们不执行这一步
ADD sources.list /etc/apt/sources.list
# 安装 ssh 服务
RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
# 复制配置文件到相应位置 , 并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 对外端口
EXPOSE 22
# 启动 ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
构建镜像
构建镜像
docker build -t ubuntu-ssh .
效果查看
使用新镜像启动一个容器,查看效果
docker run -d -p 10086:22 ubuntu-ssh
容器检查
docker ps
docker port c03d146b64d4
ssh 查看效果
ssh 192.168.8.14 -p 10086

4 .1 . 3   基础指令详解

这一节,我们来学习五个基础指令
基础指令
FROM
格式:
     FROM <image>
     FROM <image>:<tag>。
解释:
     FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
MAINTAINER
格式:
     MAINTAINER <name>
解释:
     指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
     指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
RUN
格式:
     RUN <command>    (shell模式)
     RUN["executable", "param1", "param2"]。    (exec 模式)
解释:
    表示当前镜像构建时候运行的命令
注释:
      shell模式:类似于  /bin/bash -c command
     举例: RUN echo hello
      exec  模式:类似于 RUN ["/bin/bash", "-c", "command"]
     举例: RUN ["echo", "hello"]
EXPOSE
格式:
    EXPOSE <port> [<port>...]
解释:
     设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容
器时增加-p或者-P参数对容器的端口进行分配。
ENTRYPOINT
格式:
   ENTRYPOINT ["executable", "param1","param2"]  (exec 模式)
   ENTRYPOINT command param1 param2 (shell模式)
解释:
  每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

4 .1 .4 文件编辑指令详解

这一节,我们从指令详解、 ADD 实践、 COPY 实践、 VOLUME 实践这四个方面来学习。
注意:
ADD COPY 相当于数据卷操作, VOLUME 相当于数据卷容器操作
目录文件编辑指令
ADD
格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"]
解释:
     将指定的 <src> 文件复制到容器文件系统中的 <dest>
     src 指的是宿主机,dest 指的是容器
    如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
COPY
格式:
    COPY <src>... <dest>
    COPY ["<src>",... "<dest>"]
解释:
     单纯复制文件场景,Docker推荐使用COPY  
VOLUME
格式:
    VOLUME ["/data"]
解释:
   VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
    举例:
        VOLUME ["/var/lib/tomcat7/webapps/"]
ADD 实践
拷贝普通文件
Dockerfile 文件内容
...
# 执行命令
...
# 增加文件
ADD ["sources.list","/etc/apt/sources.list"]
...
拷贝压缩文件
Dockerfile 文件内容
...
# 执行命令
...
# 增加文件
ADD ["linshi.tar.gz","/nihao/"]
...
COPY 实践
     修改 Dockerfile 文件内容 :
...
# 执行命令
...
# 增加文件
COPY index.html /var/www/html/
...
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
VOLUME 实践
修改 Dockerfile 文件内容:
# 在上一个Dockerfile文件内容基础上,在COPY下面增加一个VOLUME
VOLUME ["/data/"]
...



4 .1 .5 环境指令详解

这一节,我们从指令详解、 ENV 实践、 WORKDIR 实践这三个方面来学习。
环境设置指令
ENV
格式:
    ENV <key> <value>
    ENV <key>=<value> ...
解释:
    设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
WORKDIR
格式:
     WORKDIR /path/to/workdir    (shell 模式)
解释:
    切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd
    可以多次切换(相当于cd命令),
     也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
   举例:
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    则最终路径为 /a/b/c。

ENV 实践
修改 Dockerfile 文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个ENV
ENV NIHAO=helloworld
WORKDIR 实践
修改 Dockerfile 文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个WORKDIR
WORKDIR /nihao/itcast/
RUN ["touch","itcast.txt"]

4 .1 .6 Dockerfile 构建过程

这一节,我们从构建过程、镜像介绍、构建缓存这三个方面来学习。
 
Dockerfile 构建过程:
从基础镜像 1 运行一个容器 A
遇到一条 Dockerfile 指令,都对容器 A 做一次修改操作
执行完毕一条命令,提交生成一个新镜像 2
再基于新的镜像 2 运行一个容器 B
遇到一条 Dockerfile 指令,都对容器 B 做一次修改操作
执行完毕一条命令,提交生成一个新镜像 3
...
 
构建过程镜像介绍
构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。
提供了镜像调试的能力
我们可以通过 docker history < 镜像名 > 来查看整个构建过程所产生的镜像
 
拓展:
执行的步骤越多越好呢?还是越少越好?
 
构建缓存
我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
不适用构建缓存方法常见两种:
全部不同缓存:
docker build --no-cache -t [ 镜像名 ]:[ 镜像版本 ] [Dockerfile 位置 ]
部分使用缓存:
ENV REFRESH_DATE 2018-01-12
只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了
样例:
# 构建一个基于ubuntu-base的docker定制镜像
# 基础镜像
FROM ubuntu-base
# 镜像作者
MAINTAINER President.Wang 000000@qq.com
# 创建构建刷新时间
ENV REFRESH_DATE 2018-11-02
# 执行命令
...
构建历史:
查看构建过程查看
docker history
清理构建缓存:
docker system prune
docker system prune --volumes